package com.zhuzhiguang;

import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 随机工具类
 * @author 45466
 *
 */
public class RandomUtil {
	
	static String firstName="赵钱孙李周吴郑王" + 
			"冯陈褚卫蒋沈韩杨" + 
			"朱秦尤许何吕施张" + 
			"孔曹严华金魏陶姜" + 
			"戚谢邹喻柏水窦章" + 
			"云苏潘葛奚范彭郎" + 
			"鲁韦昌马苗凤花方" + 
			"俞任袁柳酆鲍史唐" + 
			"费廉岑薛雷贺倪汤" + 
			"滕殷罗毕郝邬安常" + 
			"乐于时傅皮卞齐康" + 
			"伍余元卜顾孟平黄" + 
			"和穆萧尹姚邵湛汪" + 
			"祁毛禹狄米贝明臧" + 
			"计伏成戴谈宋茅庞" + 
			"熊纪舒屈项祝董梁" + 
			"杜阮蓝闵席季麻强" + 
			"贾路娄危江童颜郭" + 
			"梅盛林刁钟徐邱骆" + 
			"高夏蔡田樊胡凌霍" + 
			"虞万支柯昝管卢莫" + 
			"经房裘缪干解应宗" + 
			"丁宣贲邓郁单杭洪" + 
			"包诸左石崔吉钮龚" + 
			"程嵇邢滑裴陆荣翁" + 
			"荀羊於惠甄曲家封" + 
			"芮羿储靳汲邴糜松" + 
			"井段富巫乌焦巴弓" + 
			"牧隗山谷车侯宓蓬" + 
			"全郗班仰秋仲伊宫" + 
			"宁仇栾暴甘钭厉戎" + 
			"祖武符刘景詹束龙" + 
			"叶幸司韶郜黎蓟薄" + 
			"印宿白怀蒲邰从鄂" + 
			"索咸籍赖卓蔺屠蒙" + 
			"池乔阴鬱胥能苍双" + 
			"闻莘党翟谭贡劳逄" + 
			"姬申扶堵冉宰郦雍" + 
			"卻璩桑桂濮牛寿通" + 
			"边扈燕冀郏浦尚农" + 
			"温别庄晏柴瞿阎充" + 
			"慕连茹习宦艾鱼容" + 
			"向古易慎戈廖庾终" + 
			"暨居衡步都耿满弘" + 
			"匡国文寇广禄阙东" + 
			"欧殳沃利蔚越夔隆" + 
			"师巩厍聂晁勾敖融" + 
			"冷訾辛阚那简饶空" + 
			"曾毋沙乜养鞠须丰" + 
			"巢关蒯相查后荆红" + 
			"游竺权逯盖益桓公" + 
			"万俟司马上官欧阳" + 
			"夏侯诸葛闻人东方" + 
			"赫连皇甫尉迟公羊" + 
			"澹台公冶宗政濮阳" + 
			"淳于单于太叔申屠" + 
			"公孙仲孙轩辕令狐" + 
			"钟离宇文长孙慕容" + 
			"鲜于闾丘司徒司空" + 
			"丌官司寇仉督子车" + 
			"颛孙端木巫马公西" + 
			"漆雕乐正壤驷公良" + 
			"拓跋夹谷宰父谷梁" + 
			"晋楚闫法汝鄢涂钦" + 
			"段干百里东郭南门" + 
			"呼延归海羊舌微生" + 
			"岳帅缑亢况郈有琴" + 
			"梁丘左丘东门西门" + 
			"商牟佘佴伯赏南宫" + 
			"墨哈谯笪年爱阳佟" + 
			"第五言福百家姓终";
 	
	static String STR="";
	static {
		STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
	}
	
	/**
	* 功能：获取随机正整数
	*
	* @return int 正整数
	*/
	public static int nextInt(){
		//TODO 实现代码
		ThreadLocalRandom t = ThreadLocalRandom.current();
		 int nextInt = t.nextInt();
		 return nextInt>0? nextInt: -nextInt;
	}
	
	/**
	* 功能：获取指定最大范围的随机正整数
	* 示例：min=5,max=10，那么返回5-10(包括5和10)之间任意一个数
	*
	* @param int min 最小范围，要包含最小范围值。
	* @param int max 最大范围，要包含最大范围值。
	* @return 随机数
	*/
	public static int nextInt(int min, int max) {
		
		//TODO 实现代码
		ThreadLocalRandom t = ThreadLocalRandom.current();
		return t.nextInt(min, max);
		
	}
	
	/**
	* 功能：在最小值与最大值之间截取随机数
	* 场景：在List集合中截取多个的随机记录。
	* 注意：返回的结果不能有重复值
	*
	* @param int min 起始值。
	* @param int max 结束值。
	* @return 多个随机数
	*/
	public static int[] subIntegers(int min, int max, int subLength){
		//TODO 实现代码
		ThreadLocalRandom t = ThreadLocalRandom.current();
		
		HashSet<Integer> set = new HashSet<Integer>();
		//只要set集合当中数据小于需求的个数 就一直获取
		int n=0;
		while (set.size()<subLength) {
			System.out.println("n is " + (n++));
			int nextInt = t.nextInt(min, max);
			set.add(nextInt);
		}
		
		int [] arr = new int[subLength];
		int i=0;
		for (int ranomInt : set) {
			arr[i++]=ranomInt;
		}
		return arr;
	}
	
	/**
	* 功能：获取1-9,a-Z之间的随机字符，即包括数字或字母(含大小写)的字符
	*
	* @return 随机字符
	*/
	public static char nextCharacter(){
		//TODO 实现代码
		//0-9 a-z  A-Z
		ThreadLocalRandom t = ThreadLocalRandom.current();
		int nextInt = t.nextInt(62);
		if(nextInt<=9)
			return (char)('0' + nextInt);
		
		if(nextInt<=35)
			return (char)('A' - 10  + nextInt);
		
		return (char)('a' - 36 + nextInt);
		
	}
	
	/**
	* 功能：获取指定长度的随机字符数
	* 场景：创建验证码
	*
	* @param int length 长度。
	* @return 随机字符串
	*/
	public static String nextString(int length){
		//TODO 实现代码
		ThreadLocalRandom t = ThreadLocalRandom.current();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < length; i++) {
			// 随机数值
			int nextInt = t.nextInt(62);
			sb.append(STR.charAt(nextInt));
		}
		
		return sb.toString();
	}
	
	/**
	* 功能：获取不带横线的UUID
	* 场景：上传文件时作为新文件名
	*
	* @return 不带横线的UUID
	*/
	public static String uuid(){
		//TODO 实现代码
		String uuidStr = UUID.randomUUID().toString();
		uuidStr = uuidStr.replaceAll("_", "");
		uuidStr = uuidStr.replaceAll("-", "");
		return uuidStr;
		
	}
	
	/**
	 * 获取第一个汉字
	 * @日期 2020-8-19
	 * @返回类型 String
	 * @作者 mmcro
	 */
	public static String getFirstCh() {
		// 用于保存一个汉字
		byte[] b = new byte[2];
		
		b[0]= (byte)(0xA0 + 0X10);
		b[1]= (byte)(0xA0 + 1 );
		
		try {
			return new String(b,"GBK");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}
		
	}
	
	/**
	 * 随机获取一个汉字
	 * @日期 2020-8-19
	 * @返回类型 String
	 * @作者 mmcro
	 */
	public static String getRandomCh() {
		// 用于保存一个汉字
		byte[] b = new byte[2];
		//
		ThreadLocalRandom t = ThreadLocalRandom.current();
		
		b[0]= (byte)(0xA0 + 0X10 + t.nextInt(39));  // 16 - 55  一级汉字
	    // b[0]= (byte)(0xA0 + 56 + t.nextInt(31));  // 56 - 87  一级汉字
		b[1]= (byte)(0xA0 + 1  + + t.nextInt(93)); // 
		
		try {
			return new String(b,"GBK");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}
		
	}
	
	/**
	* 功能：获取指定长度的随机中文字符串
	*
	* @param int length 长度
	* @return 随机简体中文字符串
	*/
	public static String nextSimplifiedChineseString(int length){
		
		//TODO 实现代码
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < length; i++) {
			sb.append(getRandomCh());	
		}
		return sb.toString();
	}
	
	/**
	* 功能：创建一个中文姓名
	*
	* @return 人名
	*/
	public static String generateChinesePersonName(){
		//TODO 实现代码
		//获取姓
		ThreadLocalRandom t = ThreadLocalRandom.current();
		int pos = t.nextInt(firstName.length());
		String first = firstName.substring(pos,pos+  1);
		
		 String second = nextSimplifiedChineseString(2);
		 
		 return  first + second;
		 
		
		
	}

	
}
